package ph.h.Helper;

import java.io.IOException;

import ph.h.model.Sentence;
import ph.h.model.Time;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.os.Handler;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;

public class TextHelper {
	/**
	 * Danh sách ký hiệu kết thúc câu
	 * */
	private static String[] endSentenceSignals = new String[] { ". ",".\n", "? ","?\n",
			"! ","!\n", "\n" };

	public static String[] getEndSentenceSignals() {
		return endSentenceSignals;
	}

	/**
	 * Danh sách ký tự ngoại lệ Nếu như ký tự liền sau ký tự kết thúc câu được
	 * tìm thấy là ký tự đặc biệt này thì đó sẽ không phải là ký hiệu kết thúc
	 * câu
	 * */
	private static String[] endSentenceSignalsException = new String[] { "@",
			"." };

	public static String[] getendSentenceSignalsException() {
		return endSentenceSignalsException;
	}

	public static Spannable changeSentenceColor(String txt, int start, int end) {
		// lấy ra câu cần tô màu
		Spannable WordtoSpan = new SpannableString(txt);
		WordtoSpan.setSpan(new ForegroundColorSpan(Color.RED), start, end,
				Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

		return WordtoSpan;
	}

	/**
	 * Quy trình kiểm tra ký tự kết thúc câu, phải tuân thủ nghiêm theo các quy
	 * tắc sau 1. Ký hiệu kết thúc phải nằm trong mảng endSentenceSignals (được
	 * định nghĩa ở trên) 2. Character liền sau ký tự được tìm thấy ở quy tắc 1
	 * phải không thuộc mảng endSentenceSignals (được định nghĩa ở trên) 3. Nếu
	 * giá trị int indexOfStart = before.lastIndexOf("."); bằng -1, có nghĩa là
	 * đây là câu mở đầu văn bảng, indexOfStart sẽ được gắn = 0 4. Nếu giá tri
	 * int indexOfEnd = documentText.indexOf(".", cursorPosition); bằng -1, có
	 * nghĩa đây là câu cuối cùng của văn bảng và câu này không được chấm câu,
	 * indexOfEnd sẽ được gán bằng documentText.length
	 */
	public static Sentence findSentence(int cursorPosition, String documentText) {
		//
		if (cursorPosition >= documentText.length()) {
			return null;
		}
		// before cursor
		String before = documentText.substring(0, cursorPosition);

		// tìm indexOfStart
		int indexOfStart = 0;
		for (int i = 0; i < endSentenceSignals.length; i++) {
			int canStart = before.lastIndexOf(endSentenceSignals[i]);
			// kiểm tra ký tự liền sau vị trí vừa tìm được
			if (canStart < documentText.length() - 1) {
				for (int j = 0; j < endSentenceSignalsException.length; j++) {
					if (endSentenceSignalsException[j].equals(documentText
							.charAt(canStart + 1))) {
						continue;
					}
				}
			}
			// tìm ký tự kết thúc gần cursorPosition nhất
			if (canStart > indexOfStart) {
				indexOfStart = canStart;
			}
		}
		// Loại bỏ ký tự kết thúc câu của câu trước
		if (indexOfStart > 0) {
			indexOfStart++;
		}
		// tìm indexOfEnd
		int indexOfEnd = documentText.length() - 1;
		for (int i = 0; i < endSentenceSignals.length; i++) {
			int canEnd = documentText.indexOf(endSentenceSignals[i],
					cursorPosition);

			// kiểm tra ký tự liền sau vị trí vừa tìm được
			if (canEnd < documentText.length() - 1) {
				for (int j = 0; j < endSentenceSignalsException.length; j++) {
					if (endSentenceSignalsException[j].equals(documentText
							.charAt(canEnd + 1))) {
						continue;
					}
				}
			}

			// kiểm tra đây có phải là câu cuối cùng không có dấu kết thúc hay
			// không
			if (canEnd == -1) {
				canEnd = documentText.length() - 1;
			}
			// tìm ký tự kết thúc gần cursorPosition nhất
			if (canEnd < indexOfEnd) {
				indexOfEnd = canEnd;
			}
		}
		if (indexOfEnd <= indexOfStart) {
			return null;
		}
		/*
		 * if (documentText.charAt(indexOfStart) == ' ') { indexOfStart++; } for
		 * (int i = 0; i < endSentenceSignals.length; i++) { if
		 * (endSentenceSignals
		 * [i].equals(Character.toString(documentText.charAt(indexOfEnd)))) {
		 * indexOfEnd--; break; } }
		 */
		Sentence sentence = new Sentence(indexOfStart, indexOfEnd,
				sentenceOrder_V2(documentText, cursorPosition));
		return sentence;
	}

	public static int sentenceOrderNo(String documentText, int cursorPosition) {
		int order = 0;
		// int currentPosition = 0;
		// while (cursorPosition > currentPosition) {
		for (int i = 0; i < cursorPosition; i++)
			for (int j = 0; j < endSentenceSignals.length; j++)
				for (int k = 0; k < endSentenceSignalsException.length; k++)
					if (endSentenceSignals[j].equals(Character
							.toString(documentText.charAt(i)))
					/*
					 * &&(endSentenceSignalsException[k].equals(Character.toString
					 * (documentText.charAt(i+1))))
					 */
					)
						order++;
		/*
		 * int nextEnd = documentText.length(); order++; for (int i = 0; i <
		 * endSentenceSignals.length; i++) { int canEnd =
		 * documentText.indexOf(endSentenceSignals[i], currentPosition);
		 * 
		 * //kiểm tra ký tự liền sau vị trí vừa tìm được if (canEnd <
		 * documentText.length()) { for (int j = 0; j <
		 * endSentenceSignalsException.length; j++) { if
		 * (endSentenceSignalsException[j].equals(documentText.charAt(canEnd +
		 * 1))) { continue; } } }
		 * 
		 * //tìm ký tự kết thúc gần cursorPosition nhất if (canEnd < nextEnd &&
		 * canEnd > -1) { nextEnd = canEnd; } } currentPosition = nextEnd + 1;
		 */
		return order;
	}

	public static int sentenceOrder_V2(String documentText, int cursorPosition) {
		int order = 0;
		int cursor = 1;
		while (cursor < cursorPosition) {
			// tìm indexOfEnd
			int indexOfEnd = documentText.length() - 1;
			for (int i = 0; i < endSentenceSignals.length; i++) {
				int canEnd = documentText.indexOf(endSentenceSignals[i], cursor);
				// kiểm tra ký tự liền sau vị trí vừa tìm được
				if (canEnd < documentText.length() - 1) {
					for (int j = 0; j < endSentenceSignalsException.length; j++) {
						if (endSentenceSignalsException[j].equals(Character.toString(documentText.charAt(canEnd + 1)))
								) {
							cursor++;
							continue;
						}
					}
				}

				// kiểm tra đây có phải là câu cuối cùng không có dấu kết thúc
				// hay không
				if (canEnd == -1) {
					canEnd = documentText.length() - 1;
				}
				// tìm ký tự kết thúc gần cursorPosition nhất
				if (canEnd < indexOfEnd) {
					indexOfEnd = canEnd;
				}
			}
			if (indexOfEnd > 0) {
				if (documentText.charAt(indexOfEnd - 1) == '\n'
						&& documentText.charAt(indexOfEnd) == '\n') {
					cursor++;
					continue;
				}
			}
			if (indexOfEnd < documentText.length() - 2) {
				if (documentText.charAt(indexOfEnd + 1) == '\n'
						&& documentText.charAt(indexOfEnd) == '\n') {
					cursor++;
					continue;
				}
			}
			order++;
			cursor = indexOfEnd + 1;
		}
		return order;
	}
	
	/*
	 * Phay audio
	 * startsentence: cau bat dau play
	 * endsentences: cau ket thuc play
	 * player: audio
	 */
	public static void PlayAudio(final Sentence startsentence, final Sentence endsentences, final MediaPlayer player) {
		try {
			player.prepare();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		Time start = startsentence.getTimeStart();
		Time end = endsentences.getTimeEnd();
		
		int st = (start.getHour()*60*60 + start.getMinute()*60 + start.getSecond())*1000 + start.getMiliSecond();
		int en = (end.getHour()*60*60 + end.getMinute()*60 + end.getSecond())*1000 + end.getMiliSecond();
		
		if (st > en) {
			start = endsentences.getTimeStart();
			end = startsentence.getTimeEnd();
			st = (start.getHour()*60*60 + start.getMinute()*60 + start.getSecond())*1000 + start.getMiliSecond();
			en = (end.getHour()*60*60 + end.getMinute()*60 + end.getSecond())*1000 + end.getMiliSecond();
		}
		
		player.seekTo(st); 
		player.start(); 
		
		final int temp = st;
		Handler handler = new Handler();
		handler.postDelayed(new Runnable() {
		    public void run() {
		    	player.stop();
		    	TextHelper th = new TextHelper();
		    	th.PlayAudio(startsentence, endsentences, player);
		    	
		    }
		}, (Math.abs(en-st)));
	}
	
	/*
	 * Phay audio
	 * startsentence: cau bat dau play
	 * endsentences: cau ket thuc play
	 * player: audio
	 */
	public static void PlayAudio(Sentence startsentence,final MediaPlayer player) {
		try {
			if (!player.isPlaying()) {
				player.prepare();
			}
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		Time start = startsentence.getTimeStart();
		Time end = startsentence.getTimeEnd();
		
		int st = (start.getHour()*60*60 + start.getMinute()*60 + start.getSecond())*1000 + start.getMiliSecond();
		player.seekTo(st); 
		player.start(); 	
	}
	
}
